home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / snmp_vacm.nasl < prev    next >
Text File  |  2005-01-14  |  6KB  |  250 lines

  1. #
  2. # This script was written by Renaud Deraison <deraison@cvs.nessus.org>
  3. #
  4. # Script audit and contributions from Carmichael Security <http://www.carmichaelsecurity.com>
  5. #      Erik Anderson <eanders@carmichaelsecurity.com>
  6. #      Added BugtraqID
  7. #
  8. # See the Nessus Scripts License for details
  9. #
  10.  
  11.  
  12. if(description)
  13. {
  14.  script_id(10688);
  15.  script_bugtraq_id(2427);
  16.  script_version ("$Revision: 1.11 $");
  17.  
  18.  name["english"] = "SNMP VACM";
  19.  
  20.  script_name(english:name["english"]);
  21.  
  22.  desc["english"] = "
  23. This script attempts to obtain the remote private
  24. community strings using the View-Based Access Control MIB
  25. of the remote Cisco router.
  26.  
  27. An attacker may use this flaw to gain read/write SNMP access
  28. on this router.
  29.  
  30. Additional Info : http://www.cisco.com/warp/public/707/ios-snmp-community-vulns-pub.shtml
  31.  
  32. Risk factor : High";
  33.  
  34.  
  35.  
  36.  script_description(english:desc["english"]);
  37.  
  38.  summary["english"] = "Enumerates communities via SNMP";
  39.  
  40.  script_summary(english:summary["english"]);
  41.  
  42.  script_category(ACT_GATHER_INFO);
  43.  
  44.  script_copyright(english:"This script is Copyright (C) 2001 Renaud Deraison");
  45.  family["english"] = "SNMP";
  46.  script_family(english:family["english"]);
  47.  
  48.  script_dependencies("snmp_default_communities.nasl");
  49.  script_require_keys("SNMP/community", "SNMP/port");
  50.  exit(0);
  51. }
  52.  
  53. #
  54. # Solaris comes with a badly configured snmpd which
  55. # always reply with the same value. We make sure the answers
  56. # we receive are not in the list of default values usually
  57. # answered...
  58. #
  59. function valid_snmp_value(value)
  60. {
  61.  if("/var/snmp/snmpdx.st" >< value)return(0);
  62.  if("/etc/snmp/conf" >< value)return(0);
  63.  return(1);
  64. }
  65.  
  66.  
  67. #--------------------------------------------------------------------#
  68. # Forges an SNMP GET NEXT packet                                     #
  69. #--------------------------------------------------------------------#
  70. function get_next(community, id, object)
  71. {
  72.  len = strlen(community);
  73. #display("len : ", len, "\n");
  74.  len = len % 256;
  75.  
  76.  tot_len = 4 + strlen(community) + 12 + strlen(object) + 4;
  77. # display(hex(tot_len), "\n");
  78.  _r = raw_string(0x30, tot_len, 0x02, 0x01, 0x00, 0x04, len);
  79.  o_len = strlen(object) + 2;
  80.  
  81.  a_len = 13 + strlen(object);
  82.  _r = _r + community + raw_string( 0xA1,
  83.     a_len, 0x02, 0x01, id,   0x02, 0x01, 0x00, 0x02,
  84.     0x01, 0x00, 0x30,o_len) + object + raw_string(0x05, 0x00);
  85. # display("len : ", strlen(_r), "\n");
  86.  return(_r);
  87. }
  88.  
  89. #---------------------------------------------------------------------#
  90. # Extracts the object from a reply                                    #
  91. #---------------------------------------------------------------------#
  92. function extract_obj(data)
  93. {
  94.  if(ord(data[2]) == 2)
  95.   {
  96.   cmty_len = ord(data[6]);
  97.   off = 18 + cmty_len;
  98.  }
  99.  else
  100.  {
  101.   cmty_len  = ord(data[7]);
  102.  
  103.   off = 20 + cmty_len;
  104.  }
  105.  
  106.  
  107.  
  108.  len_payload = ord(data[off]);
  109.  _obj = "";
  110.  
  111.  total_len = ord(data[off+5])+6;
  112.  
  113.  for(i=4;i<total_len;i=i+1)
  114.  {
  115.   _obj = _obj + raw_string(ord(data[off+i]));
  116.  }
  117.  
  118.  _len = strlen(_obj) + 2;
  119. # display(">len : ", _len, "\n");
  120.  _len = _len % 255;
  121.  _obj2 = raw_string(0x30, _len);
  122.  _obj = _obj2 + _obj;
  123.  
  124.  l = strlen(_obj);
  125. # for(i=0;i<l;i=i+1)display(hex(ord(_obj[i])), " ");
  126. # display("\n");
  127.  return(_obj);
  128. }
  129.  
  130.  
  131. #---------------------------------------------------------------------#
  132. # Extracts the data from a reply                                      #
  133. #---------------------------------------------------------------------#
  134. function extract_data(data)
  135. {
  136.   if(ord(data[2]) == 2)
  137.   {
  138.   cmty_len = ord(data[6]);
  139.   off1 = 18 + cmty_len;
  140.   off = 39 + cmty_len;
  141.  }
  142.  else
  143.  {
  144.   cmty_len  = ord(data[7]);
  145.   off1 = 20 + cmty_len;
  146.   off = 41 + cmty_len;
  147.  }
  148.  
  149.  
  150.  
  151.  odd = cmty_len % 2;
  152.  
  153.     
  154.      
  155.  off = 18 + ord(data[off1+5]) + 7 + cmty_len;
  156.  _len = ord(data[off]);
  157.  _data = ""; 
  158.  
  159.  
  160.     
  161.  
  162.  
  163.  #_len =  ord(data[off+18+_len]);
  164.  
  165.  for(i=0;i<_len;i=i+1){
  166.      n = ord(data[off+i+1]);
  167.     if((n > 0x00) &&
  168.        !(n == 0x5C))
  169.      _data = string(_data, raw_string(ord(data[off+i+1])));
  170.     }
  171.  return(_data);
  172. }
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179.  
  180. community = get_kb_item("SNMP/community");
  181. if(!community)exit(0);
  182.  
  183. comms = "";
  184.  
  185. port = get_kb_item("SNMP/port");
  186. if(!port) port = 161;
  187.  
  188. soc = open_sock_udp(port);
  189.  
  190. first = raw_string(0x30, 0x82, 0x00, 
  191.            0x0E, 0x06, 0x0A, 0x2b, 0x06, 0x01, 0x06, 0x03,
  192.            0x10, 0x01, 0x02, 0x01, 0x03);
  193.           
  194. id = 2;
  195. req = get_next(id:id, community:community, object:first);
  196.  
  197. send(socket:soc, data:req);
  198. r = recv(socket:soc, length:1025);
  199. if(strlen(r) < 48)exit(0);
  200.  
  201. nxt = extract_obj(data:r);
  202. data = extract_data(data:r);
  203. #display(data, "\n");
  204. if(strlen(data))
  205. {
  206.  if(valid_snmp_value(value:data))
  207.  {
  208.  comms = string(comms, ". ", data, "\n");
  209.  }
  210. }
  211.  
  212.  
  213. for(z=1;z<255;z=z+1)
  214. {
  215. req = get_next(id:id+z, community:community, object:nxt);
  216. send(socket:soc, data:req);
  217. r = recv(socket:soc, length:1025);
  218. min = 45 + strlen(community);
  219. if(strlen(r) < min)
  220.  {
  221.   z = 256;
  222.  }
  223. else
  224.  {
  225.  nxt = extract_obj(data:r);
  226.  data = extract_data(data:r);
  227.  if(strlen(data))
  228.   {
  229.   
  230.   #display(data, "\n");
  231.   if(valid_snmp_value(value:data))
  232.       comms = string(comms, ". ", data, "\n");
  233.   }
  234.  }
  235. }
  236.  
  237. if(strlen(comms))
  238. {
  239.  report = string(
  240. "It was possible to obtain the list of SNMP communities of the\n",
  241. "remote host via SNMP : \n\n", comms, "\n",
  242. "An attacker may use this information to gain r/w access on the\n",
  243. "remote router.\n",
  244. "Solution : disable the SNMP service on the remote host if you do not\n",
  245. "           use it, or filter incoming UDP packets going to this port\n",
  246. "See http://www.cisco.com/warp/public/707/ios-snmp-community-vulns-pub.shtml\n",
  247. "Risk factor : High");
  248.  security_hole(protocol:"udp", port:port, data:report);
  249. }
  250.